/*
*********************************************************************************************************
*
* 模块名称 :    bsp中间件层
* 文件名称 :    bsp_middlreware.h
* 版    本 :    V1.0
* 说    明 :    所有bsp中间件汇总，介于BSP与hal层驱动之间，向上提供接口给BSP及APP层
*
* 修改记录 :
*   版本号  日期      作者      说明
*   V1.0    2025-2-18 miaozi    正式发布
*
*
*
*********************************************************************************************************
*/

#ifndef _BSP_MIDDLEWARE_H_
#define _BSP_MIDDLEWARE_H_

#include "stm32f4xx_hal.h"
#include "arm_math.h"
#include "circular_fifo.h"

#define  ABS(a)        ((a)>0? (a):-(a))       //  取绝对值
//#define  MIN(a,b)      ((a)>(b)? (b):(a))      //  求两个数较小值
//#define  MAX(a,b)      ((a)>(b)? (a):(b))      //  求两个数较大值

#define  HI4BIT(a)     ((uint8_t)((a)>>4))     //  求一个字节的高4bit
#define  LO4BIT(a)     ((uint8_t)((a)&0x0f))   //  求一个字节的低4bit
#define  HIBYTE(a)     ((uint8_t)((a)>>8))     //  求一个字的高8bit
#define  LOBYTE(a)     ((uint8_t)((a)&0xff))   //  求一个字的低8bit
#define  HIWORD(a)     ((uint16_t)((a)>>16))      //  求一个双字的高16bit
#define  LOWORD(a)     ((uint16_t)((a)&0xffff))   //  求一个双字的低16bit

#define  MAKEBYTE(a,b)   ((uint8_t)(((uint8_t)(a)<<4)|(b)))      //  合并一个字节
#define  MAKEWORD(a,b)   ((uint16_t)(((uint16_t)(a)<<8)|(b)))    //  合并一个字
#define  MAKEDWORD(a,b)  ((uint32_t)(((uint32_t)(a)<<16)|(b)))//     合并一个双字

//  串口设备结构体
typedef struct  __PACKED
{
  UART_HandleTypeDef  *g_uart;      //  hal句柄：串口
  DMA_HandleTypeDef   *h_dma;       //  hal句柄：dma
  CircularFifo_F32_T  *pTxFifo;      /* 发送缓冲区 */
  CircularFifo_F32_T  *pRxFifo;      /* 接收缓冲区 */

  void (*FIFO_Init)(CircularFifo_F32_T *pFifo);                    //  初始化缓冲区指针
  uint8_t (*FIFO_Write)(CircularFifo_F32_T *pFifo, uint8_t data);  //  写缓冲区指针
  uint8_t (*FIFO_Read)(CircularFifo_F32_T *pFifo, uint8_t *data);  //  读缓冲区指针
  uint8_t (*FIFO_IsEmpty)(CircularFifo_F32_T *pFifo);              //  缓冲区判空指针
  uint8_t (*FIFO_IsFull)(CircularFifo_F32_T *pFifo);               //  缓冲区判满指针
}UART_T;
void  UartSend(UART_T *_pUart, uint8_t *_ucaBuf, uint16_t _usLen);       //  串口发送
void  UartDmaSend(UART_T *_pUart, uint8_t *_ucaBuf, uint16_t _usLen);

#endif
/***************************** LinkJoin(END OF FILE) *********************************/
